package top.jacktgq.lock.jmm.visibility.twoPhaseTermination.v3;

import top.jacktgq.utils.LogUtils;
import top.jacktgq.utils.Sleeper;

/**
 * 
 * @Title: TwoPhaseTermination.java 
 * @Package top.jacktgq.lock.jmm.visibility 
 * @Description: 两阶段终止线程：使用自定义volatile boolean类型标志
 * 					基于上一个版本进行优化，使用Balk（犹豫）模式
 * @author CandyWall   
 * @date 2020年11月2日 下午3:38:48 
 * @version V1.0
 */
public class Demo3 {
	public static void main(String[] args) {
		TwoPhaseTermination tpt = new TwoPhaseTermination();
		tpt.start();
		tpt.start();
		
		Sleeper.sleep(1);
		
		//停止监控线程
		tpt.stop();
	}
}

class TwoPhaseTermination {
	//监控线程
	private Thread moniterThread;
	//停止标记
	private volatile boolean stop = false;
	
	//设置一个标记，记录start方法有没有被调用过，如果调用过，就忽略第二次调用
	private boolean started = false;
	
	public void start() {
		synchronized (this) {
			//同时还需要考虑线程安全问题，所以外面需要套一个synchronized
			if (started)
				return;
			started = true;
		}
		moniterThread = new Thread(() -> {
			while (true) {
				//是否被打断
				if (stop) {
					LogUtils.log("TwoPhaseTermination", "料理后事");
					break;
				}
				try {
					Thread.sleep(300);
					LogUtils.log("TwoPhaseTermination", "执行监控记录");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, "监控线程");
		moniterThread.start();
	}
	
	//停止监控线程
	public void stop() {
		stop = true;
		moniterThread.interrupt();
	}
}
